iT邦幫忙

2025 iThome 鐵人賽

DAY 27
0

想必大家都有遇過網頁上有些互動功能,像是遊戲驗證、加密小工具,甚至會要求輸入密碼才能看到某些內容吧?

其實,背後可能用到的就是 WebAssembly(Wasm)

在 CTF 的題目裡,WASM 不只是加速程式或執行複雜邏輯,它裡面也可能藏著敏感資訊,甚至直接包含 flag。

所以說,學會觀察、分析 WASM,就是 Web 題裡一個有趣又實用的武器之一。

什麼是 WASM?

WASM(WebAssembly) 是一種可以在瀏覽器執行的低階二進制指令集,它比 JavaScript 執行快,也可以用多種語言編譯而來(C/C++、Rust…)。

常見用途像是:

  • 遊戲或動畫加速
  • 密碼驗證、加密運算
  • 跨平台功能(例如 Python/Rust 編譯到 WASM)

在 CTF 中,WASM 最常被用來:

  • 檢查輸入的密碼或 token
  • 生成或隱藏 flag 的邏輯
  • 作為 JavaScript 裡的「黑盒程式」

常見指令類型

常數 / local / global 操作

  • i32.const 8:推一個 i32 常數到 stack(此例為數值 8)
  • local.get $varX / local.set $varX:讀取 / 寫入函式的 local 變數(暫存槽)。
  • global.get $global0:讀取 module 的全域變數(例如 stack base、heap base)

load / store(記憶體存取)

  • i32.load:從某個位址開始,讀 4 bytes (32-bit) 出來當成整數。
  • i32.load8_u:從某個位址開始,讀 1 byte (8-bit),再轉成整數(自動補 0 變成 i32)。
  • i32.store:把一個 4 bytes (32-bit) 的整數寫到某個位址。
  • i32.store8:把一個 1 byte (8-bit) 的數字寫到某個位址。

整數運算

  • i32.add / i32.sub:加減整數。
  • i32.xor:位元 XOR。
  • i32.and:位元 AND。
  • i32.eq / i32.ne / i32.eqz:比較結果產生布林(0/1)。

控制流(分支 / 迴圈)

  • block / loop / br_if / br / end:WASM 的分支/迴圈結構,用來寫 while/for 或早期跳出。
  • return:函式回傳。

函式呼叫 / 回傳

  • call $strcmp:呼叫另一個 exported 或內部函式並使用其回傳值。
  • return:把 stack 的值當回傳結果彈出。

picoCTF - Some Assembly Required 2

這題只有一個輸入flag的地方,反正解法絕對不會是通靈出flag

F12之後去看一下js檔案,可以發現它會把 WASM 載入到 JS 環境

https://ithelp.ithome.com.tw/upload/images/20250922/201691058ajSMajuPz.png

到wasm檔案看一下,可以發現在copy_char那裏會對flag做xor 8,最下面給的"xakgK\5cNsl<8?nmi:<i;0j9:;?nm8i=0??:=njn=9u\00\00”就是做xor 8之後的結果,所以我們只要再對此字串做一次xor就會獲得flag了

https://ithelp.ithome.com.tw/upload/images/20250922/201691059SBVe15xZf.png

https://ithelp.ithome.com.tw/upload/images/20250922/20169105XrpFZLPq0X.png

題單

  • Some Assembly Required 1

以上就是今天的內容啦

想看更多,記得明天再來喔~


上一篇
Day26 - gdb
系列文
一天一題picoCTF:從Easy開始的新手生活27
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言